Skip to content

Conversation

@vinadomi11
Copy link

@vinadomi11 vinadomi11 commented Feb 5, 2026

What was the problem/requirement? (What/Why)

Users have no way to see estimated completion time for in-progress jobs from the CLI. This makes it harder to plan and monitor long-running render jobs.

What was the solution? (How)

Added a --show-estimates flag to deadline job list and deadline job get commands that displays estimated time remaining for in-progress jobs. The estimate is calculated by:

Computing average time per completed task
Multiplying by remaining tasks (running + pending)
Output shows human-readable durations like "5 minutes" or "1 hour, 30 minutes".

What is the impact of this change?

New optional CLI flag - no impact on existing behavior.

How was this change tested?

Have you run the unit tests?
Have you run the integration tests?
Was this change documented?

Are relevant docstrings in the code base updated?
Has the README.md been updated?
Does this PR introduce new dependencies?

This PR does not add any new dependencies.
Is this a breaking change?

No - this adds an optional flag with no changes to existing behavior.

Does this change impact security?

No security impact.


By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

@vinadomi11 vinadomi11 requested a review from a team as a code owner February 5, 2026 20:18
def cli_job():
"""
def _format_duration(seconds: float) -> str:
"""Format seconds as human-readable duration (e.g., '1 hour, 30 minutes')."""
Copy link

@jairaws jairaws Feb 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There seems to an issue with the comment quotes (e.g. """). The one in line 108 should be removed.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Issue addressed in the latest revision.

return ", ".join(parts)


def _estimate_completion_time(job: dict) -> Optional[str]:
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clever!

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is pretty cool, @vinadomi11! Could we add unit tests?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just updated!

def cli_job():
"""
def _format_duration(seconds: float) -> str:
"""Format seconds as human-readable duration (e.g., '1 hour, 30 minutes')."""
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Issue addressed in the latest revision.

)
class TestEstimateCompletionTime:
def test_format_duration_seconds(self):
from deadline.client.cli._groups.job_group import _format_duration
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we move all the imports to the top of the file? As opposed to have an import in each test.

@_handle_error
def cli_job():
"""
"""
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The spacing is broken here. You should be able to run 'hatch run fmt' to fix this up to 4 instead of 3 spaces.

This docstring should also not change in your PR. I see that below, it's adjacent to code, which looks wrong.

parts = [f"{hours} hour{'s' if hours != 1 else ''}"]
if mins:
parts.append(f"{mins} minute{'s' if mins != 1 else ''}")
return ", ".join(parts)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This helper function could go into _job_helpers.py instead of in this main job_group file, to keep this one focused on the interface itself.

@sonarqubecloud
Copy link



def _estimate_completion_time(job: dict) -> Optional[str]:
"""Estimate job completion time based on task progress and elapsed time."""
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This function returns an estimated remaining duration, not a completion time. The name should reflect that.

},
}

with patch.object(api._session, "get_boto3_session") as session_mock:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We're using the deadline_mock fixture for this instead of patching the boto3 session directly, it would be great to switch these tests over to that.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants